package review.model.singleton;

/**
 * 单例模式<br/>
 * 四）双重检查，线程安全<br/>
 * @author me@longlonggo.com
 * @version 100-000-000<br/>
 * 创建日期：2018年9月16日 <br/>
 */
public class Singleton4 {
	private static Singleton4 singletonObj;
	
	//构造函数要定义为私有的，避免错误执行实例化
	private Singleton4() {}
	
	//优点：资源利用率高,效率高
	//缺点：第一次加载时比较慢；在JDK1.4之前版本中，java处理器运行乱序执行，所以可能出现失败
	//详参考：https://blog.csdn.net/anjxue/article/details/51038466
	
	//两次判空：
	//1) 第一次判断，提高性能，避免不必要的同步锁操作(synchronized也是消耗性能的)
	//2) 第二次判断，解决多线程下安全问题：
	//	2.1)多个线程同时到达【位置2】
	//	2.2)一线程先执行【位置3】中的代码，并在此时创建单例对象
	//	2.3)一线程执行完后，二线程执行到【位置3】，由于单例对象已经一线程中被创建，所以直接跳出
	public static Singleton4 getSingleton2() {
		if(singletonObj == null) {
			//位置2
			synchronized (Singleton4.class) {
				//位置3
				if(singletonObj == null) {
					singletonObj = new Singleton4();
				}
			}
		}
		return singletonObj;
	}
}
